/***************************************************************************
 创建者: 华磊
 开始时间: 2019.3.9
 copyright: (C) 华友高科
 修改说明: (每次有修改就添加一条，带有 修改人，修改时间，修改描述)
 example (1) hualei 2017.5.8 类的具体实现代码编写

 ***************************************************************************
 *  @file xx.h
 *  功能: qt modbus client
 *
 *                                                                         *
 ***************************************************************************/
#ifndef MODBUSMASTER_H
#define MODBUSMASTER_H

#include <QObject>
#include "modbusdefine.h"
#include <QtSerialBus>

class QModbusClient;
class QModbusReply;

class ModbusMaster : public QObject
{
    Q_OBJECT
public:
    explicit ModbusMaster(ModbusConnection typeIn, QString portNameIn, SerialSettings serialSettingIn
                          , QString ip_port_in);
    ~ModbusMaster();

public:
    int initialModbusMaster();
    int connectPort();//connecting state也认为成功了，小ｂｕｇ.
    int disConnectPort();

    int getModbusError();
    int getConnectState();

    READ_WRITE_RESULT_STATE getWriteModbusResult();
    READ_WRITE_RESULT_STATE getReadModbusDataUnit(QModbusDataUnit &modbusDateUnit);

    int readModbusDataUnit_block(QModbusDataUnit &modbusDateUnit, int serverId);//main thread can not use
    int writeModbusDataUnit_block(const QModbusDataUnit &modbusDateUnit, int serverId);//main thread can not use
    int readModbusDataUnit(const QModbusDataUnit &modbusDateUnit, int serverId);//必须要确保空闲时才能操作。多线程需要等待，等待时必须处理信号。
    int writeModbusDataUnit(const QModbusDataUnit &modbusDateUnit, int serverId);//必须要确保空闲时才能操作。多线程需要等待，等待时必须处理信号。

signals:
   void readSucess_signal();
public slots:
    void onStateChanged(int state);
    void readReady();
    void onErrorOccured(QModbusDevice::Error error);

private:



private:
    QModbusReply *lastRequest;
    QModbusClient *modbusDevice;
    ModbusConnection type;

    QString portName;
    SerialSettings serialSetting;
    QString ipAndPort;


    READ_WRITE_RESULT_STATE readResult;
    READ_WRITE_RESULT_STATE writeResult;
    QModbusDataUnit readDataUnit;
};

#endif // MODBUSMASTER_H
